import { NextResponse } from 'next/server';
import { cookies } from 'next/headers';
import { verifyToken } from '@/app/lib/auth';
import prisma from '@/app/lib/prisma';
import { callErnieBot } from '@/app/lib/ernie';

// 计算基础代谢率 (BMR)
function calculateBMR(weight: number, height: number, age: number, gender: string) {
  if (gender === 'male') {
    return 88.362 + (13.397 * weight) + (4.799 * height) - (5.677 * age);
  } else {
    return 447.593 + (9.247 * weight) + (3.098 * height) - (4.330 * age);
  }
}

// 根据活动水平计算每日所需热量
function calculateDailyCalories(bmr: number, activityLevel: string) {
  const activityMultipliers = {
    sedentary: 1.2,
    light: 1.375,
    moderate: 1.55,
    active: 1.725,
    very_active: 1.9,
  };

  return bmr * activityMultipliers[activityLevel as keyof typeof activityMultipliers];
}

// 根据目标调整热量
function adjustCaloriesForGoal(calories: number, goal: string) {
  switch (goal) {
    case 'lose':
      return calories - 500; // 每天减少500卡路里以实现健康减重
    case 'gain':
      return calories + 500; // 每天增加500卡路里以实现增重
    default:
      return calories;
  }
}

export async function POST(request: Request) {
  try {
    const cookieStore = await cookies();
    const token = cookieStore.get('auth-token')?.value;

    if (!token) {
      return NextResponse.json(
        { message: '请先登录后再使用此功能' },
        { status: 401 }
      );
    }

    const payload = verifyToken(token);
    if (!payload) {
      return NextResponse.json(
        { message: '登录已过期，请重新登录' },
        { status: 401 }
      );
    }

    // 验证用户是否存在
    const user = await prisma.user.findUnique({
      where: { id: payload.userId },
    });

    if (!user) {
      return NextResponse.json(
        { message: '用户不存在' },
        { status: 401 }
      );
    }

    const data = await request.json();
    const { height, weight, age, gender, activityLevel, goal, restrictions } = data;

    // 计算每日推荐热量
    const bmr = calculateBMR(Number(weight), Number(height), Number(age), gender);
    const dailyCalories = calculateDailyCalories(bmr, activityLevel);
    const adjustedCalories = adjustCaloriesForGoal(dailyCalories, goal);

    // 计算宏量营养素分配
    const macronutrients = {
      protein: Math.round((adjustedCalories * 0.3) / 4), // 30% 蛋白质，1g = 4卡路里
      carbs: Math.round((adjustedCalories * 0.45) / 4),  // 45% 碳水，1g = 4卡路里
      fat: Math.round((adjustedCalories * 0.25) / 9),    // 25% 脂肪，1g = 9卡路里
    };

    // 修改提示词，使其更明确
    const prompt = `
作为营养师，请根据以下信息生成饮食建议，只返回JSON格式：

用户信息：
- 性别：${gender === 'male' ? '男' : '女'}
- 年龄：${age}岁
- 身高：${height}厘米
- 体重：${weight}公斤
- 活动水平：${activityLevel}
- 健康目标：${goal}
- 饮食限制：${restrictions.join(', ')}

每日推荐摄入：
- 总热量：${Math.round(adjustedCalories)}卡路里
- 蛋白质：${macronutrients.protein}克
- 碳水化合物：${macronutrients.carbs}克
- 脂肪：${macronutrients.fat}克

请返回如下JSON格式：
{
  "mealPlan": {
    "breakfast": ["食材1", "食材2"],
    "lunch": ["食材1", "食材2"],
    "dinner": ["食材1", "食材2"],
    "snacks": ["零食1", "零食2"]
  },
  "advice": "营养建议内容",
  "tips": ["注意事项1", "注意事项2"]
}`;

    console.log('发送到文心一言的提示词:', prompt); // 添加日志

    const aiResponse = await callErnieBot(prompt);
    console.log('文心一言返回的原始响应:', aiResponse);

    let aiRecommendation;
    try {
      // 如果 aiResponse 为空，直接抛出错误
      if (!aiResponse) {
        throw new Error('API 返回为空');
      }

      // 尝试清理响应文本，移除可能的多余内容
      const jsonStr = aiResponse.trim()
        .replace(/^```json\s*/, '')
        .replace(/```$/, '')
        .trim();
      
      aiRecommendation = JSON.parse(jsonStr);
      
      // 验证返回的数据结构
      if (!aiRecommendation.mealPlan || !aiRecommendation.advice || !aiRecommendation.tips) {
        throw new Error('返回的数据结构不完整');
      }
    } catch (error) {
      console.error('解析AI响应失败:', error);
      console.error('AI响应内容:', aiResponse);
      
      // 使用默认推荐
      aiRecommendation = {
        mealPlan: {
          breakfast: [
            "全麦面包 2片",
            "煮鸡蛋 1个",
            "牛奶 250ml",
            "香蕉 1根"
          ],
          lunch: [
            "糙米饭 1碗",
            "清炒西兰花 1份",
            "鸡胸肉 150g",
            "番茄汤 1碗"
          ],
          dinner: [
            "燕麦饭 1碗",
            "清蒸鱼 150g",
            "炒青菜 1份",
            "豆腐汤 1碗"
          ],
          snacks: [
            "坚果 30g",
            "苹果 1个"
          ]
        },
        advice: "根据您的身体状况和目标，建议您：\n1. 保持规律饮食，每天三餐定时定量\n2. 增加蛋白质的摄入，有助于维持肌肉量\n3. 多食用新鲜蔬菜和水果\n4. 保持充足的水分摄入",
        tips: [
          "建议在运动前后适当补充蛋白质",
          "晚餐建议在睡前3小时完成",
          "可以适当增加运动量，配合饮食计划",
          "注意食物多样性，保证营养均衡"
        ]
      };
    }

    const recommendation = {
      dailyCalories: Math.round(adjustedCalories),
      macronutrients,
      ...aiRecommendation,
    };

    try {
      // 保存到数据库
      await prisma.dietRecommendation.create({
        data: {
          userId: payload.userId,
          height: Number(height),
          weight: Number(weight),
          age: Number(age),
          gender,
          activityLevel,
          goal,
          restrictions,
          dailyCalories: recommendation.dailyCalories,
          macronutrients: JSON.stringify(recommendation.macronutrients),
          mealPlan: JSON.stringify(recommendation.mealPlan),
          advice: recommendation.advice,
          tips: JSON.stringify(recommendation.tips),
        },
      });
    } catch (dbError) {
      console.error('保存到数据库失败:', dbError);
      // 数据库错误不影响返回推荐结果
    }

    return NextResponse.json({ recommendation });
  } catch (error) {
    console.error('生成饮食推荐错误:', error);
    return NextResponse.json(
      { message: '生成饮食推荐失败，请稍后重试' },
      { status: 500 }
    );
  }
} 